// ProjectName: go-learn-demo
// PackageName: xormybxb
// Description:
// Author: hy.bai
// Date: 2025-08-19 星期二 15:17

package xormybxb

import (
	"fmt"
	"log/slog"
	"time"
)

type User struct {
	Id       int32      `xorm:"pk autoincr comment('主键')"`
	Username string     `xorm:"varchar(64) notnull unique 'username' comment('用户名')"`
	Password string     `xorm:"varchar(64) comment('密码')"`
	Age      int        `xorm:"comment('年龄')"`
	Created  *time.Time `xorm:"created comment('创建时间')"` // 创建的时候自动创建
	Updated  *time.Time `xorm:"updated comment('更新时间')"` // 更新的时候自动更新
}

// 自定义表名
// func (*User) TableName() string {
// 	return "t_user"
// }

// 通过结构体创建表结构
func TestSyncTable() {
	InitEngine()
	// 注:设置的前缀会在表名和字段名前面都会加。
	// tbMapper := names.Mapper(names.NewPrefixMapper(names.SnakeMapper{}, "t_"))
	// MysqlEngine.SetMapper(tbMapper)
	// 通过结构体对象创建表结构
	if err := MysqlEngine.Table("t_user").Sync(&User{}); err != nil {
		slog.Error(fmt.Sprintf("同步数据库表结构失败,原因是:%s", err.Error()))
	}
}

func TestDbMetas() {
	InitEngine()
	meta, err := MysqlEngine.DBMetas()
	if err != nil {
		slog.Error(fmt.Sprintf("查询数据源元数据失败,原因是:%s", err.Error()))
	}
	for index, table := range meta {
		slog.Info(fmt.Sprintf("索引是:%d, 表名:%s", index, table.Name))
		columns := table.Columns()
		for _, column := range columns {
			slog.Info(fmt.Sprintf("列名:%s", column.Name))
		}
	}
}

func TestTableInfo() {
	InitEngine()
	table, err := MysqlEngine.TableInfo(&User{}) // TableInfo方法传入的参数是结构体指针
	if err != nil {
		slog.Error(fmt.Sprintf("查询数据源元数据失败,原因是:%s", err.Error()))
	}
	slog.Info(fmt.Sprintf("表名:%s", table.Name))
	columns := table.Columns()
	for ind := range columns {
		slog.Info(fmt.Sprintf("列名:%s", columns[ind].Name))
	}
}
